home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / ICNDRW_1.ARJ / ALIEN.PAS < prev    next >
Pascal/Delphi Source File  |  1991-08-16  |  8KB  |  384 lines

  1. program alien_space_game;
  2.  
  3. {$X+}
  4. {$G+}  (* $G- for non 286 machines *)
  5. {$R-}
  6. {$S-}
  7.  
  8. uses crt,ttools,bgidriv,graph,icontool;
  9. var
  10.   startx,starty : integer;
  11.   amx,amy,mx,my : integer;
  12.   ship : array [1..6] of icon;
  13.   missile,
  14.   amiss : icon;
  15.   alien : array [1..7] of icon;
  16.   oldexit:pointer;
  17.   right_border_reached,
  18.   left_border_reached :boolean;
  19.   amiss_dead,
  20.   missile_dead,
  21.   ship_dead  :boolean;
  22.   alien_dead : boolean;
  23.   moving_left : boolean;
  24.   moving_right:boolean;
  25.   ascore,score : integer;
  26.  
  27. {$I grafinit.pas}
  28.  
  29. procedure killalien; forward;
  30.  
  31. procedure killplayer; forward;
  32.  
  33.  
  34. procedure showscore;
  35. begin
  36.   setfillstyle(solidfill,0);
  37.   bar(1,getmaxy-10,getmaxx,getmaxy);
  38.   outtextxy(1,getmaxy-10,'Your Score: '+intstr(score)+'   Alien Score: '+intstr(ascore));
  39. end;
  40.  
  41. procedure move_amiss;
  42. begin
  43.   if not amiss_dead then
  44.   begin
  45.     inc(amy,2);
  46.     if amy>getmaxy-2 then
  47.     begin
  48.       amiss_dead:=true;
  49.       amiss.display_icon;
  50.       setfillstyle(solidfill,0);
  51.       bar(1,getmaxy-3,getmaxx,getmaxy+1);
  52.     end;
  53.     if ship[1].inbounds(amx,amy) then
  54.     begin
  55.       amiss.display_icon;
  56.       amiss_dead:=true;
  57.       killplayer;
  58.       setfillstyle(solidfill,0);
  59.       bar(amiss.getx,amiss.gety,amiss.getx+amiss.get_length,amiss.gety+amiss.get_height);
  60.       inc(ascore,10);
  61.       showscore;
  62.     end
  63.     else
  64.     begin
  65.       if not amiss_dead then
  66.       begin
  67.         amiss.display_icon;
  68.         amiss.setxy(amx,amy);
  69.         amiss.display_icon;
  70.       end;
  71.     end;
  72.   end;
  73. end;
  74.  
  75. procedure move_missile;
  76. begin
  77.   dec(my,2);
  78.   if my<1 then
  79.   begin
  80.     missile_dead:=true;
  81.   end;
  82.   if alien[1].inbounds(mx,my) then
  83.   begin
  84.     missile.display_icon;
  85.     missile_dead:=true;
  86.     killalien;
  87.     setfillstyle(solidfill,0);
  88.     bar(missile.getx,missile.gety,missile.getx+missile.get_length,missile.gety+missile.get_height);
  89.     inc(score,10);
  90.     showscore;
  91.   end
  92.   else
  93.   begin
  94.     missile.display_icon;
  95.     missile.setxy(mx,my);
  96.     missile.display_icon;
  97.   end;
  98.  
  99. end;
  100.  
  101. procedure killalien;
  102. var i:integer;
  103. begin
  104.   alien_dead:=true;
  105.   for i:=1 to 7 do
  106.   begin
  107.     move_amiss;
  108.     if i>1 then
  109.       alien[i].display_icon;
  110.     delay(50);
  111.     alien[i].display_icon;
  112.     move_amiss;
  113.   end;
  114. end;
  115.  
  116. procedure killplayer;
  117. var i:integer;
  118. begin
  119.   ship_dead:=true;
  120.   ship[1].display_icon;
  121.   for i:=2 to 6 do
  122.   begin
  123.     if not missile_dead then
  124.       move_missile;
  125.     ship[i].setxy(ship[1].getx,ship[1].gety);
  126.     ship[i].display_icon;
  127.     delay(50);
  128.     ship[i].display_icon;
  129.     if not missile_dead then
  130.       move_missile;
  131.   end;
  132. end;
  133.  
  134.  
  135. procedure move_ship_left;
  136. begin
  137.   right_border_reached:=false;
  138.   ship[1].display_icon;
  139.   dec(startx,2);
  140.   if startx<1 then
  141.   begin
  142.     startx:=1;
  143.     moving_left:=false;
  144.     left_border_reached:=true;
  145.   end;
  146.   ship[1].setxy(startx,starty);
  147.   ship[1].display_icon;
  148. end;
  149.  
  150. procedure move_ship_right;
  151. begin
  152.   left_border_reached:=false;
  153.   ship[1].display_icon;
  154.   inc(startx,2);
  155.   if startx>getmaxx-ship[1].get_length then
  156.   begin
  157.     startx:=getmaxx-ship[1].get_length;
  158.     moving_right:=false;
  159.     right_border_reached:=true;
  160.   end;
  161.   ship[1].setxy(startx,starty);
  162.   ship[1].display_icon;
  163. end;
  164.  
  165. {$F+}
  166. procedure myexit;
  167. begin
  168.   exitproc:=oldexit;
  169.   closegraph;
  170.   halt(255);
  171. end;
  172. {$F-}
  173.  
  174. procedure setalienxy;
  175. var x,y,i:integer;
  176. begin
  177.   x:=random(640-alien[1].getleft);
  178.   y:=random(10)+2;
  179.   for i:=1 to 7 do
  180.     alien[i].setxy(x,y);
  181. end;
  182.  
  183. procedure move_alien;
  184. var d:byte;
  185.     i,x,y:integer;
  186. begin
  187.   d:=random(100)+1;
  188.   x:=alien[1].getx;
  189.   y:=alien[1].gety;
  190.   case d of
  191.     10 : begin
  192.           dec(y,random(5)+1);
  193.           if y<1 then
  194.             y:=1;
  195.         end;
  196.     20 : begin
  197.           inc(y,random(10)+1);
  198.           if y+alien[1].get_height>ship[1].gettop-10 then
  199.             y:=ship[1].gettop-(alien[1].get_height+10);
  200.         end;
  201.     30 : begin
  202.           dec(x,random(20)+1);
  203.           if x<1 then
  204.             {x:=getmaxx-50;}
  205.             x:=1;
  206.         end;
  207.     40 : begin
  208.           inc(x,random(20)+1);
  209.           if x>getmaxx-50 then
  210.             {x:=1;}
  211.             x:=getmaxx-50;
  212.         end;
  213.     99 : begin
  214.            if random(3)+1=2 then
  215.            if amiss_dead then
  216.              begin
  217.                amiss_dead:=false;
  218.                amx:=alien[1].getx + (alien[1].get_length div 2);
  219.                amy:=alien[1].getbottom;
  220.                amiss.setxy(amx,amy);
  221.                amiss.display_icon;
  222.             end;
  223.          end;
  224.   end;
  225.   if d in [10,20,30,40] then
  226.   begin
  227.     alien[1].display_icon;
  228.     for i:=1 to 7 do
  229.       alien[i].setxy(x,y);
  230.     alien[1].display_icon;
  231.   end;
  232. end;
  233.  
  234.  
  235. procedure main;
  236. var done:boolean;
  237.     k : char;
  238.     i,jj:integer;
  239.     mcnt : integer;
  240. begin
  241.   randomize;
  242.   oldexit:=exitproc;
  243.   exitproc:=@myexit;
  244.   done:=false;
  245.   for i:=1 to 7 do
  246.   begin
  247.     alien[i].init('','ALIEN'+intstr(i)+'.ICN',getmaxx div 2,25);
  248.     alien[i].setput(xorput);
  249.     alien[i].icontitle(false);
  250.   end;
  251.   for i:=1 to 6 do
  252.   begin
  253.     ship[i].init('','SHIP'+intstr(i)+'.ICN',1,1);
  254.     ship[i].setput(xorput);
  255.     ship[i].icontitle(false);
  256.   end;
  257.   missile.init('','MISSILE.ICN',1,1);
  258.   amiss.init('','amiss.icn',1,1);
  259.   if (not ship[1].initerror) and (not missile.initerror) and
  260.      (not alien[1].initerror) then
  261.   begin
  262.     jj:=0;
  263.     startx:=getmaxx div 2;
  264.     starty:=getmaxy - (ship[1].get_height+11);
  265.     ship[1].setxy(startx,starty);
  266.     amiss.icontitle(false);
  267.     amiss.setput(xorput);
  268.     missile.icontitle(false);
  269.     missile.setput(xorput);
  270.     alien[1].showicon;
  271.     ship[1].display_icon;
  272.     left_border_reached:=false;
  273.     right_border_reached:=false;
  274.     alien_dead:=false;
  275.     missile_dead:=true;
  276.     amiss_dead:=true;
  277.     ship_dead:=false;
  278.     moving_left:=false;
  279.     moving_right:=false;
  280.     mcnt:=0;
  281.     score:=0;
  282.     ascore:=0;
  283.     showscore;
  284.     repeat
  285.       inc(jj);
  286.       inc(mcnt);
  287.       if not missile_dead then
  288.       begin
  289.         move_missile;
  290.         if alien_dead then
  291.         begin
  292.           setalienxy;
  293.           alien_dead:=false;
  294.           alien[1].display_icon;
  295.         end;
  296.         if not moving_left and not moving_right then
  297.           delay(2);
  298.         move_alien;
  299.         if mcnt>10 then
  300.         begin
  301.           mcnt:=0;
  302.           move_amiss;
  303.         end;
  304.       end;
  305.       if moving_left and not left_border_reached then
  306.       begin
  307.         inc(mcnt);
  308.         move_alien;
  309.         move_ship_left;
  310.         if mcnt>5 then
  311.         begin
  312.            mcnt:=0;
  313.            move_amiss;
  314.         end;
  315.       end;
  316.       if moving_right and not right_border_reached then
  317.       begin
  318.         inc(mcnt);
  319.         move_alien;
  320.         move_ship_right;
  321.         if mcnt>5 then
  322.         begin
  323.           mcnt:=0;
  324.           move_amiss;
  325.         end;
  326.       end;
  327.       inc(mcnt);
  328.       if (jj=10) and not (alien_dead) then
  329.       begin
  330.         jj:=0;
  331.         move_alien;
  332.       end;
  333.       if mcnt>60 then
  334.       begin
  335.           mcnt:=0;
  336.           move_amiss;
  337.       end;
  338.       if ship_dead then
  339.       begin
  340.         ship_dead:=false;
  341.         ship[1].display_icon;
  342.       end;
  343.       if keypressed then
  344.       begin
  345.         k:=readkey;
  346.         case k of
  347.           #32: begin
  348.                  if missile_dead then
  349.                  begin
  350.                    missile_dead:=false;
  351.                    mx:=(startx+(ship[1].get_length div 2)) - missile.get_length div 2;
  352.                    my:=starty;
  353.                    missile.setxy(mx,my);
  354.                    missile.display_icon;
  355.                  end;
  356.                end;
  357.           #0 : begin
  358.                  k:=readkey;
  359.                  case k of
  360.                    curslft : begin moving_left:=true; moving_right:=false; end;
  361.                    cursrt  : begin moving_right:=true; moving_left:=false; end;
  362.                    cursup  : begin moving_right:=false; moving_left:=false; end;
  363.                  end;
  364.                end;
  365.           #27: done:=true;
  366.         end;
  367.       end;
  368.     until done;
  369.   end
  370.   else
  371.   begin
  372.     closegraph;
  373.     restorecrtmode;
  374.     writeln('Somethin'' is a amiss, captain!');
  375.   end;
  376.   closegraph;
  377.   restorecrtmode;
  378. end;
  379.  
  380. begin
  381.   grafinit;
  382.   main;
  383. end.
  384.